前言
其實分享我寫題目的過程也算是一種自我檢討,所以使用的方法可能不會是最完美的,還請各讀者多多包涵...
題目
輸入輸出格式
sol.
這題題目有點難用文字看懂,我寫的時候想超久,不過可以畫成一個表格來看,例如我們輸入
此為n=2的情況,每一次輸入都要判斷 n = 2、3、4、5、6 等五種情況的 MAPE 並選出最小值。
pseudocode
輸入periodCut
、sale
表示一期的資料
建立陣列sales
存取各期資料、MAPEarray
存取n = 2、3、4、5、6時的 MAPE、ansArray
存取最後要輸出的答案。
我在這邊使用的方法為建立一個函數判斷完各種情況的MAPE後再回到main function,不過我認為這不是最好的方法。 // 註1
void MAPE(int windowSize, int periodCut, const int sales[], int MAPEarray[], int ansArray[]);
宣告變數 total、now、min,分別代表 、現在的加總、目前為止的最小 MAPE 值。
for i in range n
total = 0.0 // 初始化
for j in range j=i ~ periodCut
now = 0.0 // 初始化
for k in range j-i ~ k<j
now += 第k期的資料 / float(i) // 將i轉換為小數型態,除出來才會是小數
now += (第j期的資料 – now) / 第j期的資料
now 取絕對值
total += now
將 (total/(periodCut – i) * 100) 轉換為int,並插入 MAPEarray
if 新加進去MAPEarray的這個數值 > min
min = 新加進的數
WindowSize = i
並將widowSize, min加入ansArray
接著回到main function中直接輸出答案
註1:
float MAPE(int indowSize, int PeriodCut, const int sales[]);
此函數所回傳的值為 n = 2 ~ 6 各情況的 MAPE,這個函數的工作基本上與前面void MAPE
函數無異,不過將最後比 MAPE 大小的部分移至 main function 中做。
在 main function 中跑一個 for 迴圈:
for n = 2 ~ 6
呼叫MAPE函數
回傳值有沒有 > 目前最小的MAPE
最後輸出答案